        TITL DAI FIRMWARE 2EA0B-2EBF3  V1.1
        ORG   :EA0B
*
*
*
**************
* FILL BLOCK *
**************
*
* Fills a rectangular block of whole fields with
* one colour.
*
* Entry: HL:    Address bottom left corner.
*        DE:    Y,X-counts of size of block (E in
*               fields).
*        FCOLR: Colour info.
* Exit:  BCDEHL preserved. AF corrupted.
*
FILBK   PUSH  B
        PUSH  D
        PUSH  H
        LDA   :00C2     ) Get details for colour
        MOV   C,A       ) required in BC
        LDA   :00C3     )
        MOV   B,A       )
        INR   E         Count range up by 1
FBK10   PUSH  D
        PUSH  H
FBK20   LDA   :00C1     Get animate flag
        ORA   A
        JNZ   :EA46     Jump if set
        LDA   :009D     Get current screen mode
        RAR
        RAR
        MOV   M,B       Colour details in screen RAM
        DCX   H
        JNC   :EA3E     Jump if 16-colour mode
 REM
* If 4-colour mode:
 REM
        MOV   M,C       Colour details in screen RAM
*
FBK30   DCX   H
        DCR   E
        JNZ   :EA19     Loop to do all fields
        POP   H         HL pnts to left of rectangle
        POP   D         Get Y-size count
        DCR   D
        INR   D
        JZ    :EA53     Abort if ready
        DCR   D         Update Y-count
        CALL  :EAC1     Update pntr to next line
        JMP   :EA17     Next line
 REM
* If 16-colour mode:
 REM
FBK40   MOV   A,M       Get data from screen RAM
        ANI   :0F       Lonibble only (old BG)
        ORA   C         Add details
        MOV   M,A       Preserve old background
        JMP   :EA2B
 REM
* If animate:
 REM
FBK50   PUSH  H
        DCR   B
        INR   B
        JNZ   :EA4D
        DCX   H
FBK60   MOV   M,C       Change whole field
        POP   H
        DCX   H
        JMP   :EA2B     Next field
*
FBK90   POP   H
        POP   D
        POP   B
        RET
*
**************
* FILL STRIP *
**************
*
* Fills a vertical strip on the screen with one
* colour.
*
* Entry: HL: Points to bottom field of strip.
*        B:  Mask bits to change.
*        D:  Height -1 of strip.
* Exit:  AF corrupted. BCDEHL preserved.
*
FILST   PUSH  B
        PUSH  D
        PUSH  H
        LDA   :009D     Get current screen mode
        RAR
        RAR
        JNC   :EAA9     Jump if 16-colour mode
 REM
* If 4-colour mode:
 REM
        PUSH  D
        XCHG
        LHLD  :00C2     Get details for colour reqd
        LDA   :00C1     Get animate flag
        ORA   A
        JNZ   :EA91     Jump if set
        MOV   A,B       )
        ANA   H         )
        MOV   C,A       ) Mask for bits to be update
        MOV   A,B       )
        ANA   L         )
        MOV   L,A       )
        MOV   A,B
        CMA             Bits to be preserved
        MOV   B,A
        MOV   H,A
FST05   XCHG
FST10   MOV   A,B
        ANA   M         Pick up old colours
        ORA   C
        MOV   M,A       Update top bits
        DCX   H
        MOV   A,D
        ANA   M
        ORA   E
        MOV   M,A       Update bottom bits
        INX   H
        XTHL
        MOV   A,H
        DCR   H
        ORA   A
        JZ    :EABC     Jump if ready
        XTHL
        CALL  :EAC1     Update pointer
        JMP   :EA79     Next line
 REM
* If animate:
 REM
FST15   PUSH  H         Preserve colour details
        MOV   A,B
        ANA   L
        MOV   C,A       Bits to be set in C
        MOV   A,B
        CMA
        ORA   L
        MOV   B,A       To be set
        MVI   L,:00
        MVI   H,:FF     For other byte
        POP   PSW       Get colour details
        ORA   A
        JNZ   :EAA6
        PUSH  B
        PUSH  H
        POP   B
        POP   H
FST18   JMP   :EA78
 REM
* If 16-colour mode:
 REM
FST20   LDA   :00C2     Get 1 byte of details colour
 REM required
        MOV   C,A       Set colour as reqd
FST30   CALL  :E8DE     Update
        MOV   A,D
        DCR   D
        ORA   A
        JZ    :EABD
        CALL  :EAC1     Next line
        JMP   :EAAD     Next field
 REM
* If ready:
 REM
FST90   POP   H
FST91   POP   H
        POP   D
        POP   B
        RET
*
**************************
* MOVE AND CHECK POINTER *
**************************
*
* DADCK: Moves a pointer 1 line up screen and
*        offsets to alternate area if necessary.
* PTRCK: Checks a memory pointer and moves it
*        into or out of the archive area if
*        necessary.
*
* Exit:  HL: New pointer.
*
DADCK   LDA   :0098     Get nr bytes/line
        CALL  :E701     Add 1 line length
PTRCK   PUSH  B
        PUSH  D
        XCHG
        LHLD  :0088     Get addr after end graphics
 REM area
        CALL  :E6FB     Compare HL-DE
        LHLD  :0084     Get bottom archive area
        MOV   B,H       ) in BC
        MOV   C,L       )
        LHLD  :0082     Get top visible area
        JNC   :EAE5     Jump if pntr is below
 REM visible screen
        CALL  :E6FB     Compare HL-DE
        JC    :D80F     Jump if pntr is off top
 REM visible screen
PCK10   XCHG
PCK15   POP   D
        POP   B
        RET
 REM
* If pntr is below visible screen:
 REM
PCK20   PUSH  H         )
        PUSH  B         ) Swop BC and HL
        POP   H         )
        POP   B         )
        CALL  :E6FB     Compare HL-DE
        JC    :EAE1     Jump if within archive area
PCK30   XCHG
        CALL  :E6F2     Subtract nearest boundary
        DAD   B         Add other
        JMP   :EAE2
*
***************************
* FILL A RECTANGULAR AREA *
***************************
*
* Entry: DE: Width.
*        B : Height.
*        C : Offset.
*        HL: Address.
* Exit: All registers preserved.
*
FILRT   PUSH  PSW
        PUSH  B
        PUSH  D
        PUSH  H
        PUSH  H
        MOV   A,C
        ADD   E
        MOV   H,A       H = C + E
        MVI   A,:00
        ADC   D
        MOV   D,B
        RAR
        MOV   A,H
        JC    :EB0D
        CPI   :08
        JC    :EB40     If > 8: Fill only one strip
L2E152  RAR
        RRC
        ANI   :7E
        XTHL
        PUSH  PSW
        RRC
        SUI   :02
        MOV   E,A
        DCX   H
        DCX   H
        CNC   :EA0B     Fill block
        INX   H
        INX   H
        MOV   A,C
        SUI   :09
        CMA
        MOV   B,A
        CALL  :EBE1     Set mask for bits
        CALL  :EA57     Fill strip
        POP   PSW
        CMA
        MOV   C,A
        MVI   B,:FF
        INX   B
        DAD   B
        POP   PSW
        ANI   :07
        INR   A
        MOV   B,A
        MVI   C,:00
L2E153  CALL  :EBE1     Set mask for bits
        CALL  :EA57     Fill strip
        JMP   :E138     Popall, ret
 REM
* If < 1 field:
 REM
L2E154  MOV   B,E
        INR   B
        POP   H
        JMP   :EB37     Fill a strip only
*
*************************
* CALCULATE HL = A * HL *
*************************
*
* Exit: AFBCDE preserved.
*
HLMUL   PUSH  PSW
        PUSH  D
        XCHG            Original HL in DE
        LXI   H,:0000   Init result
L2E156  ORA   A
        JZ    :EB5D     Abort if ready
        RAR             )
        PUSH  PSW       )
        JNC   :EB56     ) Calc HL = A * HL
        DAD   D         )
L2E157  XCHG            )
        DAD   H         )
        XCHG            )
        POP   PSW       )
        JMP   :EB4C     Cont multiplication
L2E158  POP   D
        POP   PSW
        RET
*
*************************
* CALCULATE HL = HL / A *
*************************
*
* Exit: AFBCDE preserved.
*
HLDIV   PUSH  PSW
        ORA   A
        JZ    :EB78     Abort if A=0
        PUSH  B
        PUSH  D
        LXI   B,:FFFF
        CMA
        MOV   E,A
        MVI   D,:FF
        INX   D
L2E160  DAD   D
        INX   B
        JC    :EB6F
        MOV   L,C       ) Result in HL
        MOV   H,B       )
        POP   D
        POP   B
L2E161  POP   PSW
        RET
*
*********************************************
* CHECK IF SUFFICIENT ROOM FOR GRAPHIC MODE *
*********************************************
*
* Exit: CY=1: Insufficient room for mode.
*       CY=0: O.K.
*       ABCDEHL preserved.
*
TPOSN   PUSH  B
        PUSH  PSW
        PUSH  D
        LDA   :009D     Get current screen mode
        ADI   :01
        JC    :EB96     If mode 0: Abort CY=1
        XCHG
        LHLD  :0094     Get nr of hor. blobs
        DCX   H         minus 1
        CALL  :E6FB     Compare HL-DE
        XCHG
        JC    :EB96     Abort CY=1 if insufficient
 REM room
        LDA   :0096     Get nr of graphics lines
        DCR   A         minus 1
        CMP   C         Set flags on difference
L2E163  POP   D
        POP   B
        MOV   A,B
        POP   B
        RET
*
***********************************
* FIND COLOUR IN COLORG REGISTERS *
***********************************
*
* Entry: C: Requested colour.
* Exit:  CY=1: 'Serialnr' of colour in A.
*        CY=0: Colour not available.
*        BCDEHL preserved.
*
STR164  PUSH  B
        PUSH  H
        LXI   H,:009E   Addr 1st colour byte graph
        MVI   B,:03     Total 4 colour data
L2E165  MOV   A,M       Get colour
        ANI   :0F       Colour nibble only
        CMP   C         Ident to reqd one ?
        JZ    :EBB2     Then colour found
        INX   H         Pnts to next one
        DCR   B
        JP    :EBA2     Get next colour
        ORA   A         CY=0
L2E166  POP   H
        POP   B
        RET
 REM
* If colour found:
 REM
L2E167  MVI   A,:03
        SUB   B         Colour 'nr' in A
        STC
        JMP   :EBAF     Quit, CY=1
*
**********************
* GET MEMORY POINTER *
**********************
*
SMEMMK  PUSH  D
        PUSH  PSW
        MOV   A,B
        RRC
        MOV   A,C
        RAR
        RAR
        ANI   :7E
        ADI   :04
        MOV   E,A
        MVI   D,:00
        POP   H
        PUSH  H
        MOV   L,H       Entry A in L
        MVI   H,:00
        INX   H         +1
        LDA   :0098     Get nr bytes/line
        CALL  :EB46     Calc HL=A*HL
        CALL  :E6F2     HL=HL-DE
        XCHG            Result in DE
        LHLD  :0088     Get addr after end graph
 REM area
        DAD   D         Add offset
        CALL  :EAC7     Check and move pntr
        POP   PSW
        POP   D
        RET
*
*********************
* SET MASK FOR BITS *
*********************
*
* Entry: B and C are data for mask.
* Exit:  B: Result.
*        AFCDEHL preserved.
*
SMKMSK  PUSH  PSW
        PUSH  B
        XRA   A         A=0
L2E170  STC             CY=1
        RAR
        DCR   B
        JNZ   :EBE4     RAR (B) times
L2E171  RAR
        DCR   C
        JP    :EBEA     RAR until C <= 7F
        RAL
        POP   B
        MOV   B,A       Result in B
        POP   PSW
        RET
*
*
*
        END
